#pragma once

#include "task_types.h"
#include <string>
#include <chrono>
#include <map>

namespace kernel {
namespace task {

/**
 * @brief 任务实体 - 领域层核心对象
 * @details 表示一个完整的AGV任务，包含状态、时间、元数据等
 *          遵循Clean Architecture原则，不依赖外部框架
 */
class TaskEntity {
public:
    /**
     * @brief 构造函数
     * @param taskId 唯一任务ID
     * @param type 任务类型
     * @param agvNumber AGV编号
     */
    TaskEntity(
        const std::string& taskId,
        TaskType type,
        int agvNumber
    );

    ~TaskEntity() = default;

    // ==================== 业务方法 ====================

    /**
     * @brief 启动任务
     * @return 是否成功
     */
    bool start();

    /**
     * @brief 暂停任务
     * @return 是否成功
     */
    bool pause();

    /**
     * @brief 恢复任务
     * @return 是否成功
     */
    bool resume();

    /**
     * @brief 完成任务
     */
    void complete();

    /**
     * @brief 取消任务
     */
    void cancel();

    /**
     * @brief 任务失败
     * @param errorMessage 错误消息
     */
    void fail(const std::string& errorMessage);

    /**
     * @brief 检查任务是否可以启动
     * @return 是否可以启动
     */
    bool canStart() const;

    /**
     * @brief 检查任务是否可以暂停
     * @return 是否可以暂停
     */
    bool canPause() const;

    /**
     * @brief 检查任务是否可以恢复
     * @return 是否可以恢复
     */
    bool canResume() const;

    /**
     * @brief 检查任务是否处于终止状态
     * @return 是否终止
     */
    bool isTerminated() const;

    // ==================== Getters ====================

    std::string getTaskId() const { return m_taskId; }
    TaskType getType() const { return m_type; }
    TaskStatus getStatus() const { return m_status; }
    int getAgvNumber() const { return m_agvNumber; }
    TaskPriority getPriority() const { return m_priority; }
    std::string getErrorMessage() const { return m_errorMessage; }

    std::chrono::system_clock::time_point getCreateTime() const { return m_createTime; }
    std::chrono::system_clock::time_point getStartTime() const { return m_startTime; }
    std::chrono::system_clock::time_point getEndTime() const { return m_endTime; }

    /**
     * @brief 获取任务执行时长（秒）
     * @return 执行时长，如果未启动返回0
     */
    double getElapsedSeconds() const;

    // ==================== Setters ====================

    void setPriority(TaskPriority priority) { m_priority = priority; }

    /**
     * @brief 设置任务元数据
     * @param key 键
     * @param value 值
     */
    void setMetadata(const std::string& key, const std::string& value);

    /**
     * @brief 获取任务元数据
     * @param key 键
     * @return 值，如果不存在返回空字符串
     */
    std::string getMetadata(const std::string& key) const;

private:
    // 基本信息
    std::string m_taskId;
    TaskType m_type;
    int m_agvNumber;
    TaskPriority m_priority{TaskPriority::Normal};

    // 状态信息
    TaskStatus m_status{TaskStatus::Pending};
    std::string m_errorMessage;

    // 时间信息
    std::chrono::system_clock::time_point m_createTime;
    std::chrono::system_clock::time_point m_startTime;
    std::chrono::system_clock::time_point m_endTime;

    // 元数据（用于存储任务特定的数据）
    std::map<std::string, std::string> m_metadata;
};

} // namespace task
} // namespace kernel
